/**
 * Copyright (c) 2008, Mu Dynamics.
 *  All rights reserved.
 *  
 *   Redistribution and use in source and binary forms, with or without modification, 
 *   are permitted provided that the following conditions are met:
 *   
 *  - Redistributions of source code must retain the above copyright notice, 
 *     this list of conditions and the following disclaimer.
 *  - Redistributions in binary form must reproduce the above copyright notice, 
 *     this list of conditions and the following disclaimer in the documentation and/or 
 *     other materials provided with the distribution.
 *  - Neither the name of the "Mu Dynamics" nor the names of its contributors may be used 
 *     to endorse  or promote products derived from this software without specific prior 
 *     written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
 * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 
 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package com.mu.jacob.core.ant;

import java.util.ArrayList;
import java.util.List;

import com.mu.jacob.core.builder.AbstractBuilder;
import com.mu.jacob.core.generator.GeneratorException;

/**
 * Abstract builder task configures builders.
 * @author Adam Smyczek
 */
public abstract class BuilderTask extends GeneratorTask {

	/**
	 * Supported builders enumeration
	 */
	public enum BuilderType {
		ELEMENT, FILE, CUSTOM;
	}

	/**
	 * Supported renderer engine enumeration
	 */
	public enum RendererEngine {

		VELOCITY, STRINGTEMPLATES, FREEMARKER, CUSTOM;
		
		/**
		 * @param engine
		 * @return RendererEngine enum for string representation used in 
		 * ant build.xml config.
		 */
		public static RendererEngine toEnum(String engine) {
			try {
				return RendererEngine.valueOf(engine.toUpperCase());
			} catch (Exception e) {
				return null;
			}
		}
	}
	
	/*  Context task list */
	private List<ContextTask> contextTasks = new ArrayList<ContextTask>();
	
	/* Renderer engine */
	private RendererEngine rendererEngine = null;
	
	/* Class name of custom renderer */
	private String customRendererClassName = null;
	
	/* Builder type */
	private final BuilderType type;
	
	/**
	 * Constructors initialized with the builder type
	 * @param type
	 */
	public BuilderTask(final BuilderType type) {
		super();
		this.type = type;
	}

	/**
	 * @return builder type 
	 */
	public BuilderType getType() {
		return type;
	}
	
	/**
	 * @return create new context
	 */
	public ContextTask createContext() {
		ContextTask contextTask = new ContextTask();
		contextTasks.add(contextTask);
		return contextTask;
	}	
	
	/**
	 * @return context list accessor
	 */
	protected List<ContextTask> getContextTasks() {
		return contextTasks;
	}
	
	/**
	 * @param renderer engine setter called by ant
	 */
	public void setRenderer(String renderer) {
		this.rendererEngine = RendererEngine.toEnum(renderer);
		if (this.rendererEngine == null) {
			this.customRendererClassName = renderer;
			this.rendererEngine = RendererEngine.CUSTOM;
		}
	}
	
	/**
	 * @return rendererEngine engine accessor defined
	 * defined as renderer in build.xml files
	 */
	public RendererEngine getRendererEngine() {
		return rendererEngine;
	}
	
	/**
	 * @return the customRendererClassName
	 */
	public String getCustomRendererClassName() {
		return customRendererClassName;
	}

	/**
	 * Validate builder task configuration
	 */
	protected void validateConfiguration() {
		// engine defined?
		if (rendererEngine == null) {
			throw new GeneratorException("Renderer engine is not defined!");
		}
		
		// renderer defined?
		if (getProperties().get(AbstractBuilder.PROPERTY_TEMPLATE_FILE) == null) {
			throw new GeneratorException("Template file is not defined!");
		}
	}
	
}
